﻿/**
* ...
* @author firsoff maxim, email: firsoff_maxim@mail.ru, icq:235859730, tel:+79222345364
* @version 0.1
*/

package ru.vega_int.firsoff.as3
{
	import flash.display.Loader;
	import flash.events.EventDispatcher;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.utils.getTimer;
	import flash.net.URLVariables;
	import flash.net.URLRequestMethod;
	public class BandWidthTest extends EventDispatcher
	{
		//	PROPERTIES
		//	private
		private var _downloadsCounter:uint;			//	счетчик загрузок (надо 3 штуки)
		private var _totalDownloads;				//	общее колво загрузок
		private var _rezultsArray:Array;			//	массив хранит результаты тестирования
		private var _bandWidth:Number;				//	скорость загрузки
		private var _startTime:uint;				//	время начала теста
		private var _testImage:String;				//	ссылка на тестовое изображение
		private var isError:Boolean;				//	есть ошибка (при локальном тестировании)
		private var _lastUrl:Array;
		//	public

		//	CONSTRUCTOR
		/**
		 * Конструктор
		 * @param	testImage		Ссылка на тестируемый файл
		 * @param 	totalDownloads	Общее колво загрузок
		 */
		public function BandWidthTest(testImage:String, totalDownloads:uint=3)
		{
			_downloadsCounter = 0;
			_rezultsArray = new Array;
			this._testImage = testImage;
			this._totalDownloads = totalDownloads;
			isError = false;
		};
		//	METHODS
		//	private
		private function completeTest():void
		{
			_bandWidth = 0;
			for(var i:uint; i < _rezultsArray.length; i++)
			{
				_bandWidth += _rezultsArray[i];
			};
			_bandWidth /= _downloadsCounter;
			dispatchEvent(new Event(Event.COMPLETE));
		};
		
		
		//	public
		
		/**
		 * Запуск тестирования скорости
		 */
		public function test():void
		{
			var loader:URLLoader = new URLLoader();
			var url:String = _testImage;
			var uid:String = "uniqui=" + (new Date()).getTime();
			var request:URLRequest = new URLRequest(url);
			request.data = new URLVariables(uid);
            request.method = URLRequestMethod.POST;
			_lastUrl = request.requestHeaders;
			loader.load(request);
			loader.addEventListener(Event.COMPLETE, onLoad);
			loader.addEventListener(Event.OPEN, onStart);
			loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			isError = false;
		};
		
		public function get bytesPerSecond():Number
		{
			return _bandWidth;
		};
		
		public function get kbitsPerSecond():Number
		{
			return _bandWidth/1024 * 8;
		};
		// EVENTS HANDLERS
		
		private function onLoad(e:Event):void
		{
			var downLoadTime:Number = (getTimer() - _startTime)/1000;		//	время загрузки
			_downloadsCounter++;											//	увеличиваем счетчик
			var bytesPerSecond:Number = e.target.bytesTotal/(1000 * downLoadTime);	//	байт в секунду
			_rezultsArray.push(bytesPerSecond);
			//trace('downLoadTime = '+downLoadTime)
			//trace('e.target.bytesTotal = '+e.target.bytesTotal)
			//var l:URLLoader = URLLoader(e.target);
			if(_downloadsCounter == _totalDownloads)
			{
				completeTest();
			}
			else
			{
				test();
			};
		};
		
		private function onStart(e:Event):void
		{
			_startTime = getTimer();
		};
		
		private function ioErrorHandler(e:IOErrorEvent):void
		{
			trace('BAND WIDTH TEST: ' + ioErrorHandler);
			isError = true;
			test();
		};
	};	
};